package main
import "fmt"

var arr [10]int16 // 声明了一个int类型的数组
func main() {

	//Go之所以会那么简洁，是因为它有一些默认的行为：
	/*
		大写字母开头的变量是可导出的，也就是其它包可以读取的，是公有变量；小写字母开头的就是不可导出的，是私有变量。

		大写字母开头的函数也是一样，相当于class中的带public关键词的公有函数；小写字母开头的就是有private关键词的私有函数。
	*/

	//定义一个数组  语法：var arr [n]type
	arr[0] = 1 //数组下标是从0开始的
	arr[9] = 11

	//输出所有数组参数，未赋值的默认为0
	fmt.Printf("%v\n", arr)
	fmt.Printf(" %d\n", arr[0])
	fmt.Printf("%d\n", arr[9])

	//	由于长度也是数组类型的一部分，因此[3]int与[4]int是不同的类型，数组也就不能改变长度。
	// 数组之间的赋值是值的赋值，即当把一个数组作为参数传入函数的时候，传入的其实是该数组的副本，而不是它的指针。

	//数组的另一种声明  省略var
	arr2 := [3]int{1, 2, 3} // 声明了一个长度为3的int数组 并赋值  方法内定义的参数 必须使用

	fmt.Printf("%v\n", arr2)

	arr3 := [10]int{1, 2, 3} // 声明了一个长度为10的int数组，其中前三个元素初始化为1、2、3，其它默认为0
	fmt.Printf("%v\n", arr3)

	arr4 := [...]int{1, 2, 4} // 可以省略长度而采用`...`的方式，Go会自动根据元素个数来计算长度

	fmt.Printf("%v\n", arr4)

	//二维数组

	// 声明了一个二维数组，该数组以两个数组作为元素，其中每个数组中又有4个int类型的元素
	doubleArr5 := [2][4]int{[4]int{1, 2, 3, 4}, [4]int{5, 6, 7, 8}}

	fmt.Printf("%v\n", doubleArr5)

	// 上面的声明可以简化，直接忽略内部的类型

	doubleArr6 := [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}

	fmt.Printf("%v\n", doubleArr6)

}
